// 名称: JSBridge 挂在 window上的一个属性
var JSBridge = window.JSBridge || (window.JSBridge = {});
/**
  该对象有如下方法：
  registerHandler(String, Function) 注册本地 js 方法，注册后 native可通过 JSBridge调用，注册后会将方法注册到本地变量 messageHandles中
  
  sendHandler(String, JSON, Function) h5 调用原生开放的api，调用后实际上还是本地通过 url scheme触发，调用时会将回调 id 存放到本地变量responseCallbacks 中
  
  _handleMessageFromNative h5 调用native之后的回调通知
  参数为 {reposeId: 回调id， responseData: 回调数据}
  
*/

var JSBridge = {
  // 注册本地方法供原生调用
  registerHandler: function(method, cb) {
    // 会将cb 放入 messageHandlers里面，待原生调用
  },
  messageHandles: {}, // h5注册方法集合，供native通知后回调调用
  
  // h5 主动调用native，需生成唯一的callbackId
  sendHandler: function(mathod, data, succCb, errCb) {
    // 内部通过iframe src url scheme 向native发送请求
    // 并将对应的回调注册进 responseCallbacks
    // native 处理结束后将结果信息通知到h5 通过 _handleMessageFromNative
    // h5 拿到返回信息处理 responseCallbacks 里对应的回调
  },
  responseCallbacks: {}, // 回调集合
  
  // native 通知 h5
  _handleMessageFromNative: function(message) {
     // 解析 message，然后根据通知类型执行 messageHandles 或 responseCallbacks里的回调
  }
}

/**
    注意：
    1. native 调用_handleMessageFromNative通知h5,参数为 json 字符串
    
    2. native 主动调用h5方法时 {methodName: api名, data, callbackId}
        methodName: 开放api的名称
        data: 原生处理后传递给 h5 参数
      需要把回调函数的值 return 出去，供native拿到，
      
      或者再发一个 bridge 回去，方法名是 methodNameSuccess，或者严禁掉，方法名为native生产的callbackId
*/
// 如：
bridge.register("hupu.ui.datatabupdate", (name) => {
  if(name) {
    // 再发一个bridge通知原生tab更新成功，，，method 可以为native生成的 callbackId
    bridge.send('hupu.ui.datatabsuccess', {}) 
  }
});